package com.gateon.hw.yunding.service.impl;

import com.gateon.hw.yunding.service.IYunDingService;
import com.gateon.hw.yunding.vo.AccessToken;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by gongweibing on 2020/3/18.
 */
@Service
public class YunDingServiceImpl<T> implements IYunDingService {
    // @Autowired
    private static RestTemplate restTemplate = new RestTemplate();

    // @Value("yunding.url")
    private static String yundingUrl = "http://yd.yunding360.com:81/openapi";

    private static String token = "12121";


    @Override
    public String getToken() {
//
        return null;
    }

//    public static void main(String args[]) {
//        try {
//            // 连接到 mongodb 服务
//            MongoClient mongoClient = new MongoClient("localhost", 27017);
//            // 连接到数据库
//            MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
//            System.out.println("Connect to database successfully");
//        } catch (Exception e) {
//            System.err.println(e.getClass().getName() + ": " + e.getMessage());
//        }
//    }

//    public static void main(String[] args) {
//        try {
//            //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
//            // ServerAddress()两个参数分别为 服务器地址 和 端口
//            ServerAddress serverAddress = new ServerAddress("localhost", 27017);
//            List<ServerAddress> addrs = new ArrayList<ServerAddress>();
//            addrs.add(serverAddress);
//            //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
//            MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());
//            List<MongoCredential> credentials = new ArrayList<MongoCredential>();
//            credentials.add(credential);
//            //通过连接认证获取MongoDB连接
//            MongoClient mongoClient = new MongoClient(addrs, credentials);
//            //连接到数据库
//            MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");
//            System.out.println("Connect to database successfully");
//        } catch (Exception e) {
//            System.err.println(e.getClass().getName() + ": " + e.getMessage());
//        }
//    }


    public static void main(String args[]) {
        try {
            // 连接到 mongodb 服务
            MongoClient mongoClient = new MongoClient("localhost", 27017);
            // 连接到数据库
            MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
            System.out.println("Connect to database successfully");
            MongoCollection<Document> collection = mongoDatabase.getCollection("test");
            System.out.println("集合 test 选择成功");
            //插入文档
            /**
             *  * 1. 创建文档 org.bson.Document 参数为key-value的格式
             *  * 2. 创建文档集合List<Document>
             *  * 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用 mongoCollection.insertOne(Document)
             *  * */
            Document document = new Document("title", "MongoDB").
                    append("description", "database").
                    append("likes", 100).
                    append("by", "Fly");
            List<Document> documents = new ArrayList<Document>();
            documents.add(document);
            collection.insertMany(documents);
            System.out.println("文档插入成功");
        } catch (Exception e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        }
    }


    public static String token() {
        String auth = "  {\"account\":\"ega41y5o\",\"enterpriseCode\":\"ega41y5o\",\"password\":\"M3zOGxBMsTzX6e/qSZMJPA==\"}";

        ResponseEntity<AccessToken> b = post1(yundingUrl + "/oauth/token", auth, AccessToken.class);
        return b.getBody().getAccessToken();
    }


    public static ResponseEntity get(String url, Object o, Class c) {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Authorization", token);
        httpHeaders.set("api-version", "v1");
        HttpEntity<String> b = new HttpEntity<>(null, httpHeaders);
        return restTemplate.getForEntity(url, c, b);
    }


    public static ResponseEntity post(String url, Object o, Class c) {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Authorization", token);
        httpHeaders.set("api-version", "v1");
        httpHeaders.set("Content-Type", "application/json");
        HttpEntity<Object> b = new HttpEntity<>(o, httpHeaders);
        return restTemplate.getForEntity(url, c, b);
    }


    public static ResponseEntity post1(String url, Object o, Class c) {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("api-version", "v1");
        httpHeaders.set("Content-Type", "application/json");
        HttpEntity<Object> b = new HttpEntity<>(o, httpHeaders);
        return restTemplate.postForEntity(url, b, c);
    }

//    public static void main(String[] args) {
//        System.out.println(token());
//    }
}
